package com.yida.gateway.config;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.PostConstruct;

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.yida.gateway.handler.SentinelFallbackHandler;

/**
 * 网关限流配置
 * 
 * @author yida
 */
@Configuration
public class GatewayConfig {

	@Bean
	@Order(Ordered.HIGHEST_PRECEDENCE)
	public SentinelFallbackHandler sentinelGatewayExceptionHandler() {
		return new SentinelFallbackHandler();
	}

	// @Bean
	@Order(-1)
	public GlobalFilter sentinelGatewayFilter() {
		return new SentinelGatewayFilter();
	}
    
//	@PostConstruct
//	public void doInit() {
//		// 加载网关限流规则
//		initGatewayRules();
//	}

//	/**
//	 * 网关限流规则
//	 */
//	private void initGatewayRules() {
//		Set<GatewayFlowRule> rules = new HashSet<>();
//		rules.add(new GatewayFlowRule("system-api").setCount(3) // 限流阈值
//				.setIntervalSec(60)); // 统计时间窗口，单位是秒，默认是 1 秒
//		rules.add(new GatewayFlowRule("sms-api").setCount(1) // 限流阈值
//				.setIntervalSec(60));
//		// 加载网关限流规则
//		GatewayRuleManager.loadRules(rules);
//		// 加载限流分组
//		initCustomizedApis();
//	}
//
//	/**
//	 * 限流分组
//	 */
//	private void initCustomizedApis() {
//		// 从请求中提取参数的策略，目前支持提取来源
//		// IP（PARAM_PARSE_STRATEGY_CLIENT_IP）、Host（PARAM_PARSE_STRATEGY_HOST）、任意
//		// Header（PARAM_PARSE_STRATEGY_HEADER）和任意 URL
//		// 参数（PARAM_PARSE_STRATEGY_URL_PARAM）四种模式。
//		Set<ApiDefinition> definitions = new HashSet<>();
//		// ruoyi-system 组
//		ApiDefinition api1 = new ApiDefinition("system-api").setPredicateItems(new HashSet<ApiPredicateItem>() {
//			private static final long serialVersionUID = 1L;
//			{
//				// 匹配 /user 以及其子路径的所有请求
//				add(new ApiPathPredicateItem().setPattern("/system/user/**")
//						.setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
//			}
//		});
//		ApiDefinition api2 = new ApiDefinition("sms-api").setPredicateItems(new HashSet<ApiPredicateItem>() {
//			private static final long serialVersionUID = 1L;
//			{
//				// 匹配 /sms 以及其子路径的所有请求
//				add(new ApiPathPredicateItem().setPattern("/auth/sendSmsCode")
//						.setMatchStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP));
//			}
//		});
//		definitions.add(api1);
//		definitions.add(api2);
//		// 加载限流分组
//		GatewayApiDefinitionManager.loadApiDefinitions(definitions);
//	}

}